from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import logging
from .models import JsonData

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@csrf_exempt
def save_json_data(request):
    """
    保存JSON数据的接口
    
    入参:
    - json_data: JSON格式的数据
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回数据，包含保存的JSON数据ID
    """
    if request.method != 'POST':
        return JsonResponse({
            'code': 1,
            'message': '仅支持POST请求'
        })
    
    try:
        # 解析请求体JSON数据
        data = json.loads(request.body)
        json_data = data.get('json_data')
        
        # 校验必填参数
        if not json_data:
            return JsonResponse({
                'code': 1,
                'message': '缺少必要参数：json_data'
            })
        
        # 验证JSON格式
        try:
            # 如果json_data已经是字典，则转换为字符串
            if isinstance(json_data, dict):
                json_str = json.dumps(json_data)
            else:
                # 尝试解析确保是有效的JSON
                json.loads(json_data)
                json_str = json_data
        except json.JSONDecodeError:
            return JsonResponse({
                'code': 1,
                'message': '无效的JSON格式'
            })
        
        # 查找是否已有数据，有则更新，没有则创建
        try:
            # 尝试获取第一条数据
            json_obj = JsonData.objects.first()
            if json_obj:
                # 更新已有数据
                json_obj.json = json_str
                json_obj.save()
                logger.info(f"JSON数据更新成功: id={json_obj.id}")
                message = 'JSON数据更新成功'
            else:
                # 创建新数据
                json_obj = JsonData.objects.create(json=json_str)
                logger.info(f"JSON数据创建成功: id={json_obj.id}")
                message = 'JSON数据创建成功'
        except Exception as e:
            logger.error(f"保存JSON数据时发生错误: {str(e)}")
            raise
        
        return JsonResponse({
            'code': 0,
            'message': message,
            'data': {
                'id': json_obj.id
            }
        })
    
    except Exception as e:
        logger.error(f"保存JSON数据时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })

@csrf_exempt
def get_json_data(request):
    """
    获取JSON数据的接口
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回的JSON数据
    """
    try:
        # 获取第一条数据（如果有多条，按ID降序排列取第一条）
        try:
            json_obj = JsonData.objects.first()
            if not json_obj:
                return JsonResponse({
                    'code': 1,
                    'message': '数据库中没有JSON数据'
                })
        except JsonData.DoesNotExist:
            return JsonResponse({
                'code': 1,
                'message': '数据库中没有JSON数据'
            })
        
        # 解析JSON字符串为Python对象
        try:
            json_data = json.loads(json_obj.json)
        except json.JSONDecodeError:
            # 如果解析失败，直接返回原始字符串
            json_data = json_obj.json
        
        return JsonResponse({
            'code': 0,
            'message': '获取JSON数据成功',
            'data': {
                'id': json_obj.id,
                'json_data': json_data
            }
        })
    
    except Exception as e:
        logger.error(f"获取JSON数据时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })

@csrf_exempt
def list_json_data(request):
    """
    获取JSON数据列表的接口（现在只返回一条数据）
    
    出参:
    - code: 成功0，失败1
    - message: 返回消息
    - data: 返回的JSON数据列表（只有一条）
    """
    try:
        # 获取第一条JSON数据
        json_obj = JsonData.objects.first()
        
        # 构建返回数据
        data_list = []
        if json_obj:
            data_list.append({
                'id': json_obj.id,
                'json_preview': json_obj.json[:100] + '...' if len(json_obj.json) > 100 else json_obj.json
            })
        
        return JsonResponse({
            'code': 0,
            'message': '获取JSON数据成功',
            'data': data_list
        })
    
    except Exception as e:
        logger.error(f"获取JSON数据列表时发生错误: {str(e)}")
        return JsonResponse({
            'code': 1,
            'message': f'发生错误: {str(e)}'
        })